package com.techusn.json.fromat.base.strategy;

import com.techusn.json.fromat.base.strategy.factory.FormatStrategyFactory;
import org.springframework.beans.factory.InitializingBean;


/**
 * format的策略的接口
 * 自定义策略需要实现该接口
 * @author chenYX
 * @date 2021/8/13 9:51
 * @description
 */
public interface FormatStrategy<R,T> extends InitializingBean {

    /**
     * @author : yongxiang
     * @description : 策略key 需要与注解保持一致
     * @date : 9:55 2021/8/13
     * @return key
    */
    public String getStrategyKey();
    
    /**
     * @author : yongxiang
     * @description : format数据
     * @date : 9:56 2021/8/13
     * @param value 原始值
     * @param attach 注解上的附加信息
     * @return R
    */
    public R formatData(T value,String[] attach);

    /**
     * @author : yongxiang
     * @description :将策略注册到format 策略工厂
     * 注意若key为空 或者key有重复 会抛出异常
     * @date : 11:15 2021/8/13
    */
    @Override
    default void afterPropertiesSet(){
        String strategyKey = getStrategyKey();
        if (!FormatStrategyFactory.isValidKey(strategyKey)) {
            throw new RuntimeException("format key为空 或者 format key 有重复的值");
        }
        FormatStrategyFactory.putStrategy(strategyKey,this);
    }
}
